#ifndef _backend_h

#define _backend_h

#define MAXLONG 20

/*
libera memoria
recibe: estructura de matriz en juego.
*/
void liberarMat(char **matriz, coordenada dim);
/*
asigna posición a las bolita
devuelve: estructura de coordenada que asignó
recibe: puntero a estructura de tipo coordenada y la dimension de la matriz
*/
coordenada asignarPos( coordenada * vec , int dim);

/*
busca cantidad N de espacios vacios en el tablero.
recibe:la estructura del tablero en juego y un puntero a la dimension del vector que devuelve.
devuelve: un vector de espacios vacios
*/
coordenada * buscaNespa( tablero tab, int *fin );

/*
le asigna un color a cada elemento del tablero en forma aleatoria
recibe: un puntero de puntero a char que es la matriz, una estructura de coordenadas y la cantidad de colores en juego.
*/
void asignarColor ( char **matriz, coordenada coord, int colores );

/*
calcula el puntaje segun la cantidad de bolitas alineadas y la cantidad minima de bolitas que el usuario elige
para borrar como minimo.
recibe: la cantidad de bolitas alineadas y la cantidad minima de bolitas necesarias para generar una linea.
devuelve: puntaje del jugador.
*/
int calcular_puntaje(int bolitas, int minfila);

/*
se fija si el string esta vacio. devuelve 0 si es vacio, 1 si no lo es.
recibe: vector de char es decir un string y su dimension.
devuelve un valor booleano.
*/
int esvacio(char *vec, int dim);

/*
devuelve un nro aleatorio entre cotinf y cotsup
recibe: cota inferior y cota superior del intervalo para obtener el numero random.
*/
int	randint(int cotinf, int cotsup);

/*
genera una matriz de char con fil filas y col columnas.

*/
char** armartablero(int fil,int col);

/*
	   recibe: una estructura que representa un pto
	   un vector de estructuras de ptos
	   la dimension del vector
	   retorna: 0 si el pto esta en el vector, 1 sino
	   - compara el pto con el vector de puntos, y se fija
	   si pertenece al vector o no
*/
int comparaptos(coordenada pto, coordenada * pto1, int dim);

/*

/*
guarda las posiciones de 2 puntos de la matriz en un vector.
recibe :un puntero a vector de tipo coordenada, la posiciones de los puntos en la forma
"fila,columna" respectivamente, y en que posicion del vector las guarda.
*/
void guardaPos ( coordenada **vec, int i, int j, int k, int r, int *s );

/*

*/
/*
se fija si hay una cantidad determinada de puntos alineados horizontalmente o verticalmente.
recibe: las coordenadas donde empieza a comparar, la dimension, un puntero de punteros a char, 
un puntero a un vector de coordenadas, la cantidad determinada, una variable de entrada y salida, y 2 variables de tipo int indicando como debe comparar.
*/
void horizontal ( int i, int j, int dim, char **mat, int cant, int *s, coordenada **vec, int H, int V );

/*

*/
/*se fija si hay una cantidad determinada de puntos alineados diagonalmente.
recibe: una variable de tipo tablero, las 2 coordenadas tipo int donde empieza a comparar, una variable de entrada y salida, un puntero a un vector de coordenadas, y 2 variables que indican como debe comparar.
*/
void diagonal( tablero tab, int i, int j, int *s, coordenada **vec, int D, int I);

/*

*/
/*
borra elementos de la matriz.
recibe: un puntero a tipo tablero, un vector de tipo coordenada, una variable de entrada y salida, y una variable de tipoint.
*/
void borrar ( tablero *tab, coordenada *vec, int *s, int * puntaje, int flag );

/*
	     recibe: un string 
	     un entero que representa la dimension del mismo
	     retorna: 0 si es vacio, 1 sino
	     - se fija si el string esta vacio
*/
int esvacio(char *vec, int dim);

/*

*/
/*se fija si hay elementos alineados.
recibe: una variable de tipo tablero, un variable de entrada y salida, y una varaible de tipo int que indica si alineo luego de un movimiento del usuario.
retorna: 1 si habia alineado, 0 sino.
*/
int alinea ( tablero tab, int *puntaje, int flag );

/*

*/
/*recursiva auxiliar que se fija si hay camino posible
recibe: un puntero a tipo tablero, 2 coordenadas tipo int que indican el origen, 2 coordenadas tipo int que indican el destino y una varialbe de entrada y salida.
*/
void auxExisteCam( tablero * juego, int i, int j, int k, int r, int *e );

/*

*/
/*indica si existe camino posible.
recibe: un puntero a tipo tablero, las 2 coordenadas tipo int que indican el origen, otras 2 coordenadas de tipo int que indican el destino, y una variable de entrada y salida.
retorna: 1 si existe camino, 0 sino
*/
int existeCam ( tablero*juego, int i, int j, int k, int r, int *e );
	
/*

*/
void copiarMat(coordenada dim, char ** Mat, char ** matAux);

/*
*/
int loadFile ( actual * juego, char * nombre );

/*
*/
int saveFile ( actual * juego, char * nombre );

#endif